#include "messageitem.h"
#include <QHBoxLayout>
#include <QLabel>
#include <QTime>
#include <QPropertyAnimation>
#include <QTextEdit>
#include <QtGlobal>

MessageItem::MessageItem(bool isSelf, const QString &text, QWidget *parent)
    :QWidget(parent)
{
    QHBoxLayout *layout = new QHBoxLayout(this);

    // 头像（示例代码）
    QLabel *avatar = new QLabel(this);
    avatar->setPixmap(QPixmap(isSelf ? ":/res/head_4.jpg" : ":/res/head_5.jpg")
                      .scaled(40, 40, Qt::KeepAspectRatio));
    avatar->setFixedSize(40, 40);
    avatar->setStyleSheet("border-radius: 20px; border: 1px solid #E0E0E0;");

    // 消息气泡
    QLabel *bubble = new QLabel(text);
    bubble->setWordWrap(true);
    bubble->setStyleSheet(QString(
        "background: %1;"
        "border: 1px solid %2;"
        "border-radius: 8px;"
        "padding: 8px;"
        "margin: 4px;"
        "max-width: 300px;"
    ).arg(isSelf ? "#9EEA6A" : "white")   // 背景色
     .arg(isSelf ? "#7BCF53" : "#E0E0E0")); // 边框色

    // 时间戳
    QLabel *time = new QLabel(QTime::currentTime().toString("hh:mm"));
    time->setStyleSheet("color: #666666; font-size: 10px;");

    // 布局排列
    if (isSelf) { // 自己发送：头像在右侧
        // 创建垂直布局容器（时间+气泡）
        QVBoxLayout *msgLayout = new QVBoxLayout();
        msgLayout->addWidget(time, 0, Qt::AlignRight);
        msgLayout->addWidget(bubble);
        msgLayout->setContentsMargins(0, 0, 10, 0); // 右侧留出10px间距

        // 主布局结构
        layout->addStretch();
        layout->addLayout(msgLayout);  // 先添加消息布局
        layout->addWidget(avatar);     // 最后添加头像
        layout->setAlignment(avatar, Qt::AlignTop); // 头像顶部对齐

        // 约束气泡最大宽度
        bubble->setMaximumWidth(1000);

    } else {      // 接收消息：头像在左侧
        QVBoxLayout *msgLayout = new QVBoxLayout();
        msgLayout->addWidget(time);
        msgLayout->addWidget(bubble);
        msgLayout->setContentsMargins(10, 0, 0, 0); // 左侧留出10px间距

        layout->addWidget(avatar);     // 先添加头像
        layout->addLayout(msgLayout);  // 再添加消息布局
        layout->addStretch();
        layout->setAlignment(avatar, Qt::AlignTop); // 头像顶部对齐

        bubble->setMaximumWidth(1000);
    }
}

QTextEdit* createMessageBubble(const QString& text, bool isSelf, int maxWidth = 300) {
    QTextEdit* bubble = new QTextEdit();
    bubble->setReadOnly(true);
    bubble->setFrameShape(QFrame::NoFrame);

    // 隐藏滚动条
    bubble->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    bubble->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    // 设置字体（确保测量和显示一致）
    QFont font = bubble->font();
    font.setPointSize(12);
    bubble->setFont(font);

    // 样式表（精确计算边距）
    QString style = QString(
        "QTextEdit {"
        "   background: %1;"
        "   border: 1px solid %2;"
        "   border-radius: 8px;"
        "   padding: 8px;"          // 内边距：8px（上下左右）
        "   margin: 4px;"           // 外边距：4px（上下左右）
        "}"
    ).arg(isSelf ? "#9EEA6A" : "white")
     .arg(isSelf ? "#7BCF53" : "#E0E0E0");
    bubble->setStyleSheet(style);

    // 设置文本（强制换行）
    bubble->setHtml(QString("<div style='white-space: pre-wrap; word-break: break-all;'>%1</div>").arg(text.toHtmlEscaped()));

    // 关键步骤：动态计算尺寸
    QTextDocument* doc = bubble->document();

    // 1. 获取实际内容区域的最大允许宽度
    const int padding = 16;    // 左右内边距总和（8px*2）
    const int margin = 8;      // 左右外边距总和（4px*2）
    const int maxContentWidth = maxWidth - padding - margin;

    // 2. 强制文档在最大宽度下布局
    doc->setTextWidth(maxContentWidth);

    // 3. 获取实际渲染后的内容尺寸
    const qreal contentWidth = doc->idealWidth();
    const qreal contentHeight = doc->size().height();

    // 4. 计算气泡最终尺寸（添加容差）
    const int bubbleWidth = qMin(
        static_cast<int>(contentWidth) + padding + margin + 2, // +2px容差
        maxWidth
    );
    const int bubbleHeight = static_cast<int>(contentHeight) + 16; // 上下内边距（8px*2）

    // 5. 设置气泡尺寸
    bubble->setFixedSize(bubbleWidth, bubbleHeight);

    return bubble;
}

MessageItem::MessageItem(bool isSelf, const QString &text, const QString &icon, QWidget *parent)
    :QWidget(parent)
{
    QHBoxLayout *layout = new QHBoxLayout(this);
    // 头像（示例代码）
    QLabel *avatar = new QLabel(this);
    avatar->setPixmap(QPixmap(icon).scaled(40, 40, Qt::KeepAspectRatio));
    avatar->setFixedSize(40, 40);
    avatar->setStyleSheet("border-radius: 20px; border: 1px solid #E0E0E0;");

    // 消息气泡
//    QLabel *bubble = new QLabel(text);
//    bubble->setWordWrap(true);
//    bubble->setStyleSheet(QString(
//        "background: %1;"
//        "border: 1px solid %2;"
//        "border-radius: 8px;"
//        "padding: 8px;"
//        "margin: 4px;"
//        "max-width: 300px;"
//    ).arg(isSelf ? "#9EEA6A" : "white")   // 背景色
//     .arg(isSelf ? "#7BCF53" : "#E0E0E0")); // 边框色
    // 创建气泡控件
    QTextEdit* bubble = createMessageBubble(text,isSelf);


    // 时间戳
    QLabel *time = new QLabel(QTime::currentTime().toString("hh:mm"));
    time->setStyleSheet("color: #666666;"
                        "font-size: 12px;"
                        "font-family: Microsoft YaHei;");

    // 布局排列
    if (isSelf) { // 自己发送：头像在右侧
        // 创建垂直布局容器（时间+气泡）
        QVBoxLayout *msgLayout = new QVBoxLayout();
        msgLayout->addWidget(time, 0, Qt::AlignRight);
        msgLayout->addWidget(bubble);
        msgLayout->setContentsMargins(0, 0, 10, 0); // 右侧留出10px间距

        // 主布局结构
        layout->addStretch();
        layout->addLayout(msgLayout);  // 先添加消息布局
        layout->addWidget(avatar);     // 最后添加头像
        layout->setAlignment(avatar, Qt::AlignTop); // 头像顶部对齐

        // 约束气泡最大宽度
        //bubble->setMaximumWidth(1000);

    } else {      // 接收消息：头像在左侧
        QVBoxLayout *msgLayout = new QVBoxLayout();
        msgLayout->addWidget(time);
        msgLayout->addWidget(bubble);
        msgLayout->setContentsMargins(10, 0, 0, 0); // 左侧留出10px间距

        layout->addWidget(avatar);     // 先添加头像
        layout->addLayout(msgLayout);  // 再添加消息布局
        layout->addStretch();
        layout->setAlignment(avatar, Qt::AlignTop); // 头像顶部对齐

        //bubble->setMaximumWidth(1000);
    }
}
